package br.com.news.web;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.news.utils.database.beans.EnqueteBean;
import br.com.news.utils.database.beans.RespostaEnqueteBean;
import br.com.news.utils.database.beans.enums.Perfil;
import br.com.news.web.annotations.Permission;
import br.com.news.web.service.EnqueteService;
import br.com.news.web.service.RespostaEnqueteService;

@Permission(profile={Perfil.ADMINISTRADOR})
@ViewScoped
@ManagedBean
public class EnqueteMB extends BaseMB implements Serializable {

	private static final long serialVersionUID = 1L;
	public static final String ROUTE = "enquete.xhtml";

	private String valorSelecionado;
	private boolean status = true;
	private EnqueteBean buscarEnquete;
	private RespostaEnqueteBean respostaEnquete;
	private List<EnqueteBean> enquetes;
	private List<EnqueteBean> enquetesAtivas;
	private List<EnqueteBean> ultimaEnqueteAtiva;
	
	private String resultadoEnquete;		
	private String description;
	private boolean navegacao = false;
	private double votoTotal;
	private String votoTotalFormat;
	private double votoSim;	
	private String votoSimFormat;	
	private double percentualSim;
	private String percentualSimFormat;
	private double votoNao;	
	private String votoNaoFormat;	
	private double percentualNao;
	private String percentualNaoFormat;
	private RespostaEnqueteBean descricao;	
	private List<RespostaEnqueteBean> resultado;	
	
	public EnqueteMB() {		
		limpar();
	}
		
	public void salvar() {			
		if (buscarEnquete.getQuestao().isEmpty()) {
			addErrorMessage("formEnquete", "Preencha o campo questão!");
		} else if (buscarEnquete != null && buscarEnquete.getIdEnquete() != null) {			
			getEnqueteService().update(buscarEnquete);
			if (buscarEnquete.isStatus() == true) {
				addInfoMessage("formEnquete", "Enquete ativada");
			} else {
				addInfoMessage("formEnquete", "Enquete inativada");
			}
			buscarEnquete = new EnqueteBean();
			buscarEnquete.setStatus(true);
			buscar();
		} else {
			buscarEnquete.setDatacriacao(new Date());
			getEnqueteService().save(buscarEnquete);
			addInfoMessage("formEnquete", "Enquete salva");
			buscarEnquete = new EnqueteBean();
			buscarEnquete.setStatus(true);
			buscar();
		}	
	}
	
	public void encerrar(EnqueteBean buscarEnquete) {		
		if (buscarEnquete != null && buscarEnquete.getIdEnquete() != null) {
			buscarEnquete.setStatus(false);
			getEnqueteService().update(buscarEnquete);
			addInfoMessage("formEnquete", "Enquete encerrada");
			buscarEnquete = new EnqueteBean();
			buscar();			
		}
	}
	
	public void limpar() {
		respostaEnquete = new RespostaEnqueteBean();
		buscarEnquete = new EnqueteBean();		
		buscarEnquete.setStatus(true);
		EnqueteService enqueteService = new EnqueteService();		
		enquetesAtivas = enqueteService.pollActive();
		ultimaEnqueteAtiva = getEnqueteService().lastPoll();
	}
	
	public void buscar() {		
		if (buscarEnquete != null) {
			EnqueteService enqueteService = new EnqueteService();					
			enquetes = enqueteService.findByQuestion(buscarEnquete);
		} 
		
		if (enquetes.size() == 0) {
			addInfoMessage("formEnquete", "Nenhuma enquete encontrada");
		}
		
		if (buscarEnquete.isStatus() == false) {
			status = false;
		} else {
			status = true;
		}
	}
	
	public void editar(EnqueteBean enquete) {
		buscarEnquete = enquete;
	}

	public void votar() {		
		
		if (!valorSelecionado.isEmpty()) {
			EnqueteService enqueteService = new EnqueteService();								
			enquetes = enqueteService.lastPoll();
			buscarEnquete = enquetes.get(0);
			
			enqueteService.votar(valorSelecionado, buscarEnquete);
			resultadoEnquete();
			status = false;
			navegacao = true;
		} else {
			addInfoMessage("formEnqueteOpcao", "Marque uma das opções");
		}	
	}
	
	public void resultadoEnquete() {
		RespostaEnqueteService respostaEnqueteService = new RespostaEnqueteService();					
		enquetes = respostaEnqueteService.lastPoll();
		buscarEnquete = enquetes.get(0);		
		description = "tem";		
		DecimalFormat format = new DecimalFormat("###.#");
		
		try {
			resultado = respostaEnqueteService.resultVote(buscarEnquete);
			navegacao = true;						
			if (resultado.size() == 1) {				
				descricao = resultado.get(0);
				if (descricao.getRowCount() != 0) {
					if (descricao.getAlternativaEnquete().getAlternativaEnqueteKey().getIdEnquete() != null) {								
						if (descricao.getAlternativaEnquete().getDescricao().equals("SIM") && descricao.getRowCount() == 1) {
							description = "sim";	
						} else if (descricao.getAlternativaEnquete().getDescricao().equals("SIM") && descricao.getRowCount() > 1) {
							votoSim = resultado.get(0).getRowCount();
							votoSimFormat = format.format(votoSim);
							description = "simMaisQueUm";
						} else if (descricao.getAlternativaEnquete().getDescricao().equals("NAO") && descricao.getRowCount() > 1) {
							votoNao = resultado.get(0).getRowCount();
							votoNaoFormat = format.format(votoNao);
							description = "naoMaisQueUm";
						} else {
							description = "nao";
						}
					} 
				} else {
					description = "nenhum";
				}
			} else {
				votoSim = resultado.get(0).getRowCount();				
				votoNao = resultado.get(1).getRowCount();			
				votoTotal = votoSim + votoNao;
				
				percentualSim = (double) Math.ceil(votoSim * 100) / (votoTotal);
				percentualNao = (double) Math.floor(votoNao * 100) / (votoTotal);
				
				votoTotalFormat = format.format(votoTotal);
				percentualSimFormat = format.format(percentualSim);
				percentualNaoFormat = format.format(percentualNao);
			}
		} catch(Exception e) {	
			e.getMessage();
		}
	}
		
	public void voltar() {
		navegacao = false;
	}
	
	public String getValorSelecionado() {
		return valorSelecionado;
	}

	public void setValorSelecionado(String valorSelecionado) {
		this.valorSelecionado = valorSelecionado;
	}

	public boolean isStatus() {
		return status;
	}

	public void setStatus(boolean status) {
		this.status = status;
	}

	public EnqueteBean getBuscarEnquete() {
		return buscarEnquete;
	}

	public void setBuscarEnquete(EnqueteBean buscarEnquete) {
		this.buscarEnquete = buscarEnquete;
	}

	public List<EnqueteBean> getEnquetes() {
		return enquetes;
	}

	public void setEnquetes(List<EnqueteBean> enquetes) {
		this.enquetes = enquetes;
	}

	public List<EnqueteBean> getEnquetesAtivas() {
		return enquetesAtivas;
	}

	public void setEnquetesAtivas(List<EnqueteBean> enquetesAtivas) {
		this.enquetesAtivas = enquetesAtivas;
	}

	public List<EnqueteBean> getUltimaEnqueteAtiva() {
		return ultimaEnqueteAtiva;
	}

	public void setUltimaEnqueteAtiva(List<EnqueteBean> ultimaEnqueteAtiva) {
		this.ultimaEnqueteAtiva = ultimaEnqueteAtiva;
	}

	public RespostaEnqueteBean getRespostaEnquete() {
		return respostaEnquete;
	}

	public void setRespostaEnquete(RespostaEnqueteBean respostaEnquete) {
		this.respostaEnquete = respostaEnquete;
	}

	public boolean isNavegacao() {
		return navegacao;
	}

	public void setNavegacao(boolean navegacao) {
		this.navegacao = navegacao;
	}
	
	public String getResultadoEnquete() {
		return resultadoEnquete;
	}

	public void setResultadoEnquete(String resultadoEnquete) {
		this.resultadoEnquete = resultadoEnquete;
	}

	public String getDescription() {
		return description;
	}

	public double getVotoTotal() {
		return votoTotal;
	}

	public void setVotoTotal(double votoTotal) {
		this.votoTotal = votoTotal;
	}

	public double getVotoSim() {
		return votoSim;
	}

	public void setVotoSim(double votoSim) {
		this.votoSim = votoSim;
	}

	public double getPercentualSim() {
		return percentualSim;
	}

	public void setPercentualSim(double percentualSim) {
		this.percentualSim = percentualSim;
	}

	public double getVotoNao() {
		return votoNao;
	}

	public void setVotoNao(double votoNao) {
		this.votoNao = votoNao;
	}

	public double getPercentualNao() {
		return percentualNao;
	}

	public void setPercentualNao(double percentualNao) {
		this.percentualNao = percentualNao;
	}

	public String getVotoSimFormat() {
		return votoSimFormat;
	}

	public void setVotoSimFormat(String votoSimFormat) {
		this.votoSimFormat = votoSimFormat;
	}

	public String getVotoNaoFormat() {
		return votoNaoFormat;
	}

	public void setVotoNaoFormat(String votoNaoFormat) {
		this.votoNaoFormat = votoNaoFormat;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getVotoTotalFormat() {
		return votoTotalFormat;
	}

	public void setVotoTotalFormat(String votoTotalFormat) {
		this.votoTotalFormat = votoTotalFormat;
	}

	public String getPercentualSimFormat() {
		return percentualSimFormat;
	}

	public void setPercentualSimFormat(String percentualSimFormat) {
		this.percentualSimFormat = percentualSimFormat;
	}

	public String getPercentualNaoFormat() {
		return percentualNaoFormat;
	}

	public void setPercentualNaoFormat(String percentualNaoFormat) {
		this.percentualNaoFormat = percentualNaoFormat;
	}

	public List<RespostaEnqueteBean> getResultado() {
		return resultado;
	}

	public void setResultado(List<RespostaEnqueteBean> resultado) {
		this.resultado = resultado;
	}
	
}
